<?php
//date格式化一个本地的日期时间
//格式串：(1)普通字符，原样显示 (2)特殊字符，具有特殊含义
echo date("北京时间：Y年m月d日 H:i:s.v e\n"); //北京时间：2025年10月31日 08:11:30.000 Asia/Shanghai
//创建DateTime对象并利用构造方法进行初始化
$d=new DateTime(); //2025-10-31 08:17:39.058512 Asia/Shanghai
$d=new DateTime("2000-10-1 12:34:56"); //2000-10-01 12:34:56.000000
$d=new DateTime("2000-10-1"); //2000-10-01 00:00:00.000000
$d=new DateTime("2000-10"); //2000-10-01 00:00:00.000000
$d=new DateTime("20001001 123456"); //2000-10-01 12:34:56.000000
$d=new DateTime("123456"); //2025-10-31 12:34:56.000000
$d=new DateTime("12:34:56"); //2025-10-31 12:34:56.000000
$d=new DateTime("12:34"); //2025-10-31 12:34:00.000000
$d=new DateTime("2000/10/01 12:34:56"); //2000-10-01 12:34:56.000000
print_r($d);
//日期的格式化
//在调用对象的属性或方法时用->, 而不是 =>
$a=["name"=>"张三", "age"=>18];
echo $d->format("Y年m月d日 H:i:s.v e\n"); //=new DateTime("2000/10/01 12:34:56");
//获取UNIX时间戳，单位是秒，从UTC 1970-1-1零时到现在的秒数
$d=new DateTime("1970/1/1", new DateTimeZone("UTC"));
echo $d->format("Y年m月d日 H:i:s.v e\n"); //1970年01月01日 00:00:00.000 UTC
echo $d->getTimestamp(),"\n"; // 0
//根据时间戳来创建日期对象
$d=new DateTime("@1761873099"); //时间戳整数前一定要加@
echo $d->format("Y-m-d H:i:s e\n"); //2025-10-31 01:11:39 +00:00
//修改日期对象的时区，可以显示同一时刻不同地区本地的时间
$d->setTimezone(new DateTimeZone("PRC"));
echo $d->format("Y-m-d H:i:s e\n"); //2025-10-31 09:11:39 PRC

//DateTimeInterface接口
//实现类(1)DateTime可变的 (2)DateTimeImmutable不可变的
$d->setDate(2000,12,23);
echo $d->format("Y-m-d H:i:s e\n"); //2000-12-23 09:11:39 PRC
$d=new DateTimeImmutable("@1761873099");
echo $d->setTimezone(new DateTimeZone("PRC"))
    ->setDate(2000,12,23)
    ->format("Y-m-d H:i:s e\n"); //2000-12-23 09:11:39 PRC
echo $d->format("Y-m-d H:i:s e\n"); //2025-10-31 01:11:39 +00:00
//修改日期时间
$d=new DateTimeImmutable("2025-10-31 12:34:56");
echo $d->format("Y-m-d H:i:s e\n"); //2025-10-31 12:34:56 Asia/Shanghai
echo $d->modify("+1 day")->format("Y-m-d H:i:s e\n"); //2025-11-01 12:34:56 Asia/Shanghai
echo $d->modify("-2 days")->format("Y-m-d H:i:s e\n"); //2025-10-29 12:34:56 Asia/Shanghai
echo $d->modify("-2 days +2 minute +10 seconds")->format("Y-m-d H:i:s e\n"); //2025-10-29 12:37:06 Asia/Shanghai
//本周\下周\上周 周一的日期
echo $d->modify("monday this week")->format("Y-m-d H:i:s e\n"); //2025-10-27 00:00:00 Asia/Shanghai
echo $d->modify("monday next week")->format("Y-m-d H:i:s e\n"); //2025-11-03 00:00:00 Asia/Shanghai
echo $d->modify("monday last week")->format("Y-m-d H:i:s e\n"); //2025-10-20 00:00:00 Asia/Shanghai
//本月1号的日期
echo $d->modify("first day of this month")->format("Y-m-d H:i:s e\n"); //2025-10-01 12:34:56 Asia/Shanghai
//当前是第9周，求开学时间
$currentWeek=9;
echo $d->modify("monday next week -$currentWeek weeks")
    ->format("Y-m-d H:i:s e\n"); //2025-09-01 00:00:00 Asia/Shanghai
//求本月1号是星期几？
echo (new DateTime())->modify("first day of this month")->format("Y年m月1日 是星期 N\n"); //2025年10月1日 是星期 3
//求当前日期所在的月有几天？
echo (new DateTime())->format("Y年m月有 t 天\n"); //2025年10月有 31 天
//写一个函数，显示指定年、月的月历
function yueli($year, $month){ //显示月历
    $d=new DateTime("$year-$month");
    echo $d->format("     Y年m月\n");
    echo "一 二 三 四 五 六 日\n";
    $w=$d->format("N")-1; //0星期一，6星期日
    echo str_repeat('   ',$w);
    $days=$d->format("t"); //该月的天数
    for($i=1;$i<=$days;$i++){
        printf("%2d ", $i);
        if(($w+$i)%7==0)echo "\n";
    }
}
yueli(2025,10);